序言

RP2040 (Raspberry Pi Pico) 拥有双核 Cortex-M0+ 架构和独特的 PIO 状态机。在进行 Rust 嵌入式开发时,我们需要一套稳定可靠的烧录与调试方案。

虽然官方提供了基于 USB 存储模拟的 UF2 拖拽烧录方式,但在实际开发中,我们需要断点调试、RTT 日志输出以及一键自动烧录。本文整合了从最基础的软件工具到进阶的硬件调试方案。


第一部分:软件烧录工具 (文件传输)

这部分介绍运行在电脑端的纯软件工具,它们主要用于将编译好的固件(UF2/ELF)传输给 RP2040,通常利用 BootROM 或 USB 协议,不涉及硬件调试器

原理:利用 RP2040 BootROM 中的固化程序,模拟 USB 大容量存储设备。

操作

  1. 按住板上的 BOOTSEL 键插入 USB。
  2. 电脑识别出 RPI-RP2 磁盘。
  3. .uf2 文件拖入即可。

评价

无需任何软件,适合发布固件,但不适合频繁开发调试。

工具elf2uf2-rs

功能:Rust 专用工具,自动将 ELF 转为 UF2 并搜索 Pico 磁盘烧录。

安装方式:

bash
cargo install elf2uf2-rs

配置

toml
# .cargo/config.toml
[target.thumbv6m-none-eabi]
runner = "elf2uf2-rs --deploy --serial --verbose"

工具picotool (官方 CLI)

功能

  • 查看已连接设备picotool info -a
  • 烧录 UF2/ELF/BINpicotool load my_firmware.uf2
  • 强行进入刷机模式picotool load -f my_firmware.uf2 (需要原固件中启用了 USB stdio 且未死机)
  • 重启设备picotool reboot

获取:随 Pico SDK 安装或通过包管理器(如 brew)安装。


第二部分:调试运行器 (Debug Runners)

这部分软件运行在电脑端,充当桥梁角色。它们连接 USB 硬件调试器(如 Picoprobe, DAPLink),并向上层提供调试服务(GDB, RTT)。

工具probe-rs

特点: Rust 嵌入式开发的现代标准工具,无需安装 OpenOCD。它内置了对 CMSIS-DAP、ST-Link 等协议的支持,可以直接与硬件调试器通信,实现烧录、复位、RTT 日志读取。

安装方式:

bash
cargo install probe-rs-tools

常用命令

bash
# 自动寻找连接的调试器,烧录并运行,同时输出 RTT 日志
probe-rs run --chip RP2040 <BIN FILE>

配置: 在 .cargo/config.toml 中设置 runner,即可实现 cargo run 一键调试:

toml
[target.thumbv6m-none-eabi]
runner = "probe-rs run --chip RP2040"

工具OpenOCD

特点: 历史悠久,兼容性极广。对于某些特殊的调试固件(如 pico-debug),probe-rs 目前存在兼容性问题,此时必须使用 OpenOCD 作为后端。

典型用法: 开启一个后台进程连接调试器,然后 GDB 或 IDE 连接到 OpenOCD 的端口(通常是 3333)进行调试。

bash
openocd -f interface/cmsis-dap.cfg -f target/rp2040.cfg

第三部分:硬件调试方案

这部分解决 “用什么硬件连接 RP2040 SWD 接口” 的问题。RP2040 使用 Multi-drop SWD 协议,部分老旧调试器可能不兼容。

使用第二块 Pico 作为专用调试器,或者购买官方的 Raspberry Pi Debug Probe。这是官方推荐且最稳定的方案。

1. 固件选型说明

固件文件对应硬件核心 MCU选型依据
debugprobe.uf2Raspberry Pi Debug ProbeRP2040专为官方调试探针硬件设计,适配其内置电平转换电路和专属引脚布局。
debugprobe_on_pico.uf2Raspberry Pi PicoRP2040最常用。用于将闲置 Pico 刷成调试探针,复用 Pico 原生引脚。
debugprobe_on_pico2.uf2Raspberry Pi Pico 2RP2350适配 Pico 2 硬件,保持与 Pico 的引脚兼容性。

2. 引脚定义 (以 Pico 为例)

使用 debugprobe_on_pico.uf2 固件时:

功能GPIO 引脚说明
SWCLK (时钟)GPIO 2连接到目标板的 SWCLK
SWDIO (数据)GPIO 3连接到目标板的 SWDIO
GNDGND必须共地
UART TXGPIO 4(可选) 连接到目标板的 RX
UART RXGPIO 5(可选) 连接到目标板的 TX
LEDGPIO 25指示工作状态

注意

官方成品 Debug Probe 的引脚定义不同(SWCLK=GP12, SWDIO=GP14),请务必根据硬件下载对应固件。

如果你手头只有一块 Pico,可以让它利用自身的一个核心来调试另一个核心。

  • 资源仓库majbthrd/pico-debug
  • 原理:固件运行在 RAM 中,模拟成 CMSIS-DAP 接口。
  • 适用软件必须配合 OpenOCD 使用。目前 probe-rs 对该方案支持不佳。

固件版本选择

推荐:pico-debug-gimmecache.uf2

  • 特点:保留 Flash 缓存 (XIP),保留 248KB (94%) SRAM 给用户程序。
  • 理由:性能影响最小,适合绝大多数场景。

备选:pico-debug-maxram.uf2

  • 特点:提供完整的 264KB SRAM。
  • 缺点:占用了 Flash 缓存,会导致用户代码运行变慢,仅在急需内存时使用。

提示

随着时间推移,直接购买原装 STM32F103 的 ST-Link 越来越难,很多廉价克隆版可能导致兼容性问题。 使用通用的 STM32F103 开发板(BluePill)或兼容的 ST-Link V2 Dongle 配合 dap42 固件是高性价比选择。

1. 固件文件说明

文件名说明
DAP103-dapboot-combined-stlink.bin新手推荐。适用于 ST-Link V2 硬件,集成 Bootloader,一步到位。
DAP42.bin / DAP42DC.bin适用于 BluePill 开发板 (PA9/PA10 USB)。
DAP103-HID-*.binHID 版本,免驱兼容性更好,无需 WinUSB 驱动。
DAP103-DFU-*.bin带有 DFU 功能的版本,方便后续通过 USB 升级。
DAP103-stlink.bin纯固件,需自行处理 Bootloader。
BRAINv3.3.bin适用于 Brain V3.3 硬件。

2. 烧录指南 (救砖模式)

如果你手头有另一个调试器(如另一块 DAPLink 或 ST-Link),可以使用 probe-rs 将固件刷入你的 ST-Link Dongle:

bash
# 警告:请确保你了解硬件连接,错误操作可能导致设备变砖 (需要飞线连接内部 SWD 接口)
probe-rs download --chip stm32f103c8 --protocol swd --binary-format bin --base-address 0x08000000 .\DAP103-dapboot-combined-stlink.bin

3. 引脚定义 (刷入 dap42 后)

信号引脚说明
SWDIOPB14对应原 ST-Link 的 SWDIO
SWCLKPB13对应原 ST-Link 的 SWCLK
RESETPB0复位引脚
TXPA2虚拟串口发送
RXPA3虚拟串口接收

除了上述方案,还有许多开源硬件 / 固件支持 RP2040 调试:

  • ST-Link V2 (STM32F103C8) [不推荐]:

    • GitHub
    • 需注意引脚重映射,最后更新于 2020 年。
  • 第二块 Pico (DapperMime) [不推荐]:

    • 下载地址
    • 类似 Picoprobe,但运行 DapperMime 固件。仓库已存档。
  • WeAct MiniF4 (STM32F4x1):

  • HS-Probe (STM32F723):

    • GitHub
    • 基于 STM32F7 的高速调试器,Rust 社区作品。
  • DAPLink (通用):

    • 适用于 LPC4322, LPC11U35, K20 等芯片的 DAPLink 固件。
    • GitHub 源码

补充阅读:其他调试方案

1. Black Magic Probe (GDB Server)

如果不想用 OpenOCD,可以将 ST-Link 刷成 Black Magic Probe (BMP) 固件。它内置了 GDB Server,可以直接用 GDB 连接,无需中间件。

点击展开:刷写与使用教程

1. 准备工作

**2. 刷入固件 **

  • 方案 C:ST-Link V2 Clone (dap42) 步骤相同。

3. 硬件接线

  • SWCLK -> RP2040 SWCLK
  • SWDIO -> RP2040 SWDIO
  • GND -> GND

4. GDB 调试

  • 查找 COM 端口:较小编号的为 GDB 接口,较大编号的为 UART。
  • 启动 GDB 并连接:
    bash
    arm-none-eabi-gdb your_firmware.elf
  • GDB 内部执行:
    gdb
    target extended-remote \\.\COM10  # 替换实际端口
    monitor swdp_scan               # 扫描 SWD 设备
    attach 1                        # 连接第一个设备
    load                            # 烧录
    run                             # 运行

J-Link 配合 OpenOCD 调试 RP2040 需要进行驱动替换(Zadig -> WinUSB)等繁琐配置。除非手头只有 J-Link,否则不建议作为首选方案。

参考教程

详细配置步骤请参考:Raspberry Pi Pico SWD with J-Link

//posts/hardware/rp2040/RP2040 烧录与调试:从 UF2 到 CMSIS-DAP.html